package modulos;

import util.Operations;
import util.Util;
//commitar
public class PreProcessing {
	public static double[][] imageGraying(double [][][] imagem) throws Exception{
		double imagemCinza[][] = new double[imagem[0].length][imagem[0][0].length];
		for(int i=0;i<imagem[0].length;i++)
		{
			for(int j=0;j<imagem[0][0].length;j++)
			{
				imagemCinza[i][j] = (int)(0.299*imagem[0][i][j] + 0.587*imagem[1][i][j] + 0.114*imagem[2][i][j]); 
			}
		}
		return imagemCinza;
	}
	
	public static double[][] backgroundSubtraction(double [][] imageBase, double[][]image,double threshold){
		double[][] resp = new double[image.length][image[0].length];
		for (int i = 0; i < image.length; i++) {
			for (int j = 0; j < image[0].length; j++) {
				if(Math.abs(image[i][j]- imageBase[i][j]) < threshold){
					resp[i][j] = 255;
				}else{
					resp[i][j] = image[i][j];
				}
			}
		}
		return resp;
	}
	
	public static double[][][] backgroundSubtraction(double [][][] background, double[][][]foreground,double threshold){
		double[][][] resp = new double[3][foreground[0].length][foreground[0][0].length];
		for (int i = 0; i < foreground[0].length; i++) {
			for (int j = 0; j < foreground[0][0].length; j++) {
				double limiar0= Math.abs(foreground[0][i][j]- background[0][i][j]);
				double limiar1 = Math.abs(foreground[1][i][j]- background[1][i][j]);
				double limiar2 = Math.abs(foreground[2][i][j]- background[2][i][j]);
				//double media = (limiar0+limiar1+limiar2)/3;		
				
				boolean thresh1 = limiar0<threshold && limiar1<threshold;
				
				boolean thresh2 = limiar0<threshold && limiar2<threshold;
				
				boolean thresh3 = limiar1<threshold && limiar2<threshold;
				
				
				if( (thresh1&&thresh2) && (thresh1&&thresh3) && (thresh2&&thresh3)){
					resp[0][i][j] = 255;
					resp[1][i][j] = 255;
					resp[2][i][j] = 255;
				}else{
					resp[0][i][j] = foreground[0][i][j];
					resp[1][i][j] = foreground[1][i][j];
					resp[2][i][j] = foreground[2][i][j];
				}
			}
		}
		return resp;
	}
	
	public static double[][] start(String dir,double[][] background,double[][]foreground,double threshold ) throws Exception{
				
		double[][] imagem_subtraida = PreProcessing.backgroundSubtraction(background, foreground, threshold);
		Util.salvaImagem(dir + "PASSO1-Threshold" + threshold + ".jpg", imagem_subtraida);

		//teste
		double [][] teste = Operations.applySobelOperator(imagem_subtraida);
		Util.salvaImagem(dir + "PASSO_teste-Threshold" + threshold + ".jpg", teste);
		
	//	double[][] imagem_subtraida_media = Operations.returnMedian(teste, 3);
		
		double[][] imagem_subtraida_mediana = Operations.returnMedian(imagem_subtraida, 3);
		
		Util.salvaImagem(dir + "PASSO2-Threshold" + threshold + ".jpg", imagem_subtraida_mediana);
		
		double[][] imagem_subtraida_mediana_binarizada = Operations.binarizationOtsu(imagem_subtraida_mediana);//Operations.binarizationNiblack(imsubMe, 0.8, 17);//Operations.binarizationOtsu(imsubMe);//Operations.binarizationNiblack(imsubMe, 0.8, 17);//Operations.binarizationOtsu(imsubMe);
		Util.salvaImagem(dir + "PASSO3-Threshold" + threshold + ".jpg", imagem_subtraida_mediana_binarizada);
		
		return imagem_subtraida_mediana_binarizada;
	}
	
	public static double[][] start(String dir,double[][][] background, double[][][]foreground, double threshold) throws Exception{
		double[][][] imagem_subtraida = PreProcessing.backgroundSubtraction(background, foreground, threshold);
		double[][] imagem_cinza = PreProcessing.imageGraying(imagem_subtraida);
		Util.salvaImagem(dir + "PASSO1-Threshold" + threshold + ".jpg", imagem_cinza);
		double[][] imagem_mediana = Operations.returnMedian(imagem_cinza, 3);
		Util.salvaImagem(dir + "PASSO2-Threshold" + threshold + ".jpg", imagem_mediana);
		double[][] imagem_subtraida_mediana_binarizada = Operations.binarizationOtsu(imagem_mediana);
		Util.salvaImagem(dir + "PASSO3-Threshold" + threshold + ".jpg", imagem_subtraida_mediana_binarizada);
		
		return imagem_subtraida_mediana_binarizada;
	
	}
	
}
